package com.weichen.studentgameexchange.common.dto;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.SchemaProperty;
import lombok.Data;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 功能：
 * 作者：惟尘
 * 日期：2025/1/27 22:32
 */
@Data
@Schema(description = "分页结果")
public class PageDTO<T> {

    @SchemaProperty(name = "总条数")
    private Long total;
    @SchemaProperty(name = "总页数")
    private Long pages;
    @SchemaProperty(name = "集合")
    private List<T> list;

    /**
     * 直接拷贝
     * @param p
     * @param EtoV
     * @return
     * @param <E>
     * @param <V>
     */
    public  <E, V> Page<V> go(Page<E> p,Class<V> EtoV){
        PageDTO<V> dto = new PageDTO<>();
        // 1.总条数
        dto.setTotal(p.getTotal());
        // 2.总页数
        dto.setPages(p.getPages());
        // 3.当前页数据是否为空
        List<E> records = p.getRecords();
        if (CollUtil.isEmpty(records)) {
//            throw new ServiceException("数据为空！");
        }
        for (E c : records) {
            dto.list.add(BeanUtil.copyProperties(c, EtoV));
        }
        //4.创建新的分页对象，将 UserVo 列表设置到分页对象中
        Page<V> voPage = new Page<>();
        voPage.setCurrent(p.getCurrent());
        voPage.setSize(p.getSize());
        voPage.setTotal(p.getTotal());
        voPage.setRecords(dto.list);
        return voPage;
    }


    /**
     * 自己转换类型,进行数据特殊处理
     * @param p
     * @param convertor
     * @return
     * @param <E>
     * @param <V>
     */

    public static <E, V> Page<V> go(Page<E> p, Function<E, V> convertor){
        // 当前页数据是否为空
        List<E> records = p.getRecords();
        if (CollUtil.isEmpty(records)) {
//            throw new ServiceException("数据为空！");
        };
        //拷贝user的VO
        List<V> vList =(records.stream().map(convertor).collect(Collectors.toList()));
        //创建新的分页对象，将 UserVo 列表设置到分页对象中
        Page<V> voPage = new Page<>();
        voPage.setCurrent(p.getCurrent());
        voPage.setSize(p.getSize());
        voPage.setTotal(p.getTotal());
        voPage.setRecords(vList);
        return voPage;
    }

}
